import cv2
import matplotlib.pyplot as plt

image = cv2.imread("img/Montage_11.jpg")
image2 = cv2.imread("img/Montage_11.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 50, 180, cv2.THRESH_BINARY)

filtedContours = []

_, contours, hierarchy = cv2.findContours(binary, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
# cv2.drawContours(image, contours, -1, (0, 255, 0), 3)


for i in range(len(contours)):
    temp = contours[i][0:, 0, 0]
    if (contours[i].size>100 and temp.max()-temp.min()<256): #and hierarchy[0][i][2]!=-1):
         filtedContours.append(contours[i])


cv2.drawContours(image, contours, -1, (0, 255, 0), 3)

cv2.drawContours(image2, filtedContours, -1, (0, 255, 0), 3)

plt.subplot(2, 2, 1)
plt.imshow(gray)

plt.subplot(2, 2, 2)
plt.imshow(binary)

plt.subplot(2, 2, 3)
plt.imshow(image)

plt.subplot(2, 2, 4)
plt.imshow(image2)
plt.show()

# cv2.waitKey(0)



# doc
#findContours
# 第二个参数表示轮廓的检索模式，有四种（本文介绍的都是新的cv2接口）：
#     cv2.RETR_EXTERNAL表示只检测外轮廓
#     cv2.RETR_LIST检测的轮廓不建立等级关系
#     cv2.RETR_CCOMP建立两个等级的轮廓，上面的一层为外边界，里面的一层为内孔的边界信息。如果内孔内还
#     cv2.RETR_TREE建立一个等级树结构的轮廓。
# 第三个参数method为轮廓的近似办法
#     cv2.CHAIN_APPROX_NONE存储所有的轮廓点，相邻的两个点的像素位置差不超过1，即max（abs（x1-x2），abs（y2-y1））==1
#     cv2.CHAIN_APPROX_SIMPLE压缩水平方向，垂直方向，对角线方向的元素，只保留该方向的终点坐标，例如一个矩形轮廓只需4个点来保存轮廓信息
#     cv2.CHAIN_APPROX_TC89_L1，CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
#
# hierarchy返回值
# 此外，该函数还可返回一个可选的hiararchy结果，这是一个ndarray，其中的元素个数和轮廓个数相同，每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3]，分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号，如果没有对应项，则该值为负数。



